[IA64] linux: remove dom0vp_populate_physmap hypercall
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Fri, 12 May 2006 14:53:49 +0000 (08:53 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Fri, 12 May 2006 14:53:49 +0000 (08:53 -0600)
dom0 vp model: remove populate_physmap hypercall which becomes unnecesarry
because xenmem operation is fully supported by the previous patch.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
linux-2.6-xen-sparse/arch/ia64/xen/drivers/Makefile
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
linux-2.6-xen-sparse/arch/ia64/xen/util.c
linux-2.6-xen-sparse/include/asm-ia64/hypercall.h

index 5fd27e4178e553ba2bb5408af58790ab05de048b..cfc560b338e773a665f04271a74c64f63f4bebe4 100644 (file)
@@ -8,7 +8,7 @@ obj-y   += core/
 #obj-y += char/
 obj-y  += console/
 obj-y  += evtchn/
-#obj-y += balloon/
+obj-$(CONFIG_XEN_IA64_DOM0_VP) += balloon/
 obj-y  += privcmd/
 obj-y  += xenbus/
 
index 1c14597d3417b5c300d6cd56c3aafea432971b4d..8f642f3a34e142887cc643646fcfd5b210094a3b 100644 (file)
 #include <asm/page.h>
 #include <asm/hypervisor.h>
 #include <asm/hypercall.h>
-
-#define XEN_IA64_BALLOON_IS_NOT_YET
-#ifndef XEN_IA64_BALLOON_IS_NOT_YET
+#include <xen/interface/memory.h>
 #include <xen/balloon.h>
-#else
-#define balloon_lock(flags)    ((void)flags)
-#define balloon_unlock(flags)  ((void)flags)
-#endif
 
 //XXX xen/ia64 copy_from_guest() is broken.
 //    This is a temporal work around until it is fixed.
@@ -148,6 +142,39 @@ static void contiguous_bitmap_clear(
        }
 }
 
+static unsigned long
+HYPERVISOR_populate_physmap(unsigned long gpfn, unsigned int extent_order,
+                           unsigned int address_bits)
+{
+       unsigned long ret;
+        struct xen_memory_reservation reservation = {
+               .nr_extents   = 1,
+                .address_bits = address_bits,
+                .extent_order = extent_order,
+                .domid        = DOMID_SELF
+        };
+       set_xen_guest_handle(reservation.extent_start, &gpfn);
+       ret = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation);
+       BUG_ON(ret != 1);
+       return 0;
+}
+
+static unsigned long
+HYPERVISOR_remove_physmap(unsigned long gpfn, unsigned int extent_order)
+{
+       unsigned long ret;
+       struct xen_memory_reservation reservation = {
+               .nr_extents   = 1,
+               .address_bits = 0,
+               .extent_order = extent_order,
+               .domid        = DOMID_SELF
+       };
+       set_xen_guest_handle(reservation.extent_start, &gpfn);
+       ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
+       BUG_ON(ret != 1);
+       return 0;
+}
+
 /* Ensure multi-page extents are contiguous in machine memory. */
 int
 __xen_create_contiguous_region(unsigned long vstart,
@@ -156,29 +183,29 @@ __xen_create_contiguous_region(unsigned long vstart,
        unsigned long error = 0;
        unsigned long gphys = __pa(vstart);
        unsigned long start_gpfn = gphys >> PAGE_SHIFT;
-       unsigned long num_pfn = 1 << order;
+       unsigned long num_gpfn = 1 << order;
        unsigned long i;
        unsigned long flags;
 
-       scrub_pages(vstart, 1 << order);
+       scrub_pages(vstart, num_gpfn);
 
        balloon_lock(flags);
 
-       //XXX order
-       for (i = 0; i < num_pfn; i++) {
-               error = HYPERVISOR_zap_physmap(start_gpfn + i, 0);
-               if (error) {
-                       goto out;
-               }
+       error = HYPERVISOR_remove_physmap(start_gpfn, order);
+       if (error) {
+               goto fail;
        }
 
        error = HYPERVISOR_populate_physmap(start_gpfn, order, address_bits);
-       contiguous_bitmap_set(start_gpfn, 1UL << order);
+       if (error) {
+               goto fail;
+       }
+       contiguous_bitmap_set(start_gpfn, num_gpfn);
 #if 0
        {
        unsigned long mfn;
        unsigned long mfn_prev = ~0UL;
-       for (i = 0; i < 1 << order; i++) {
+       for (i = 0; i < num_gpfn; i++) {
                mfn = pfn_to_mfn_for_dma(start_gpfn + i);
                if (mfn_prev != ~0UL && mfn != mfn_prev + 1) {
                        xprintk("\n");
@@ -188,7 +215,7 @@ __xen_create_contiguous_region(unsigned long vstart,
                                vstart, virt_to_bus((void*)vstart),
                                phys_to_machine_for_dma(gphys));
                        xprintk("mfn: ");
-                       for (i = 0; i < 1 << order; i++) {
+                       for (i = 0; i < num_gpfn; i++) {
                                mfn = pfn_to_mfn_for_dma(start_gpfn + i);
                                xprintk("0x%lx ", mfn);
                        }
@@ -202,44 +229,73 @@ __xen_create_contiguous_region(unsigned long vstart,
 out:
        balloon_unlock(flags);
        return error;
+
+fail:
+       for (i = 0; i < num_gpfn; i++) {
+               error = HYPERVISOR_populate_physmap(start_gpfn + i, 0, 0);
+               if (error) {
+                       BUG();//XXX
+               }
+       }
+       goto out;
 }
 
 void
 __xen_destroy_contiguous_region(unsigned long vstart, unsigned int order)
 {
+       unsigned long flags;
        unsigned long error = 0;
-       unsigned long gphys = __pa(vstart);
-       unsigned long start_gpfn = gphys >> PAGE_SHIFT;
-       unsigned long num_pfn = 1 << order;
+       unsigned long start_gpfn = __pa(vstart) >> PAGE_SHIFT;
+       unsigned long num_gpfn = 1UL << order;
+       unsigned long* gpfns;
+       struct xen_memory_reservation reservation;
        unsigned long i;
-       unsigned long flags;
 
-       scrub_pages(vstart, 1 << order);
+       gpfns = kmalloc(sizeof(gpfns[0]) * num_gpfn,
+                       GFP_KERNEL | __GFP_NOFAIL);
+       for (i = 0; i < num_gpfn; i++) {
+               gpfns[i] = start_gpfn + i;
+       }
 
-       balloon_lock(flags);
+       scrub_pages(vstart, num_gpfn);
 
-       contiguous_bitmap_clear(start_gpfn, 1UL << order);
+       balloon_lock(flags);
 
-       //XXX order
-       for (i = 0; i < num_pfn; i++) {
-               error = HYPERVISOR_zap_physmap(start_gpfn + i, 0);
-               if (error) {
-                       goto out;
-               }
+       contiguous_bitmap_clear(start_gpfn, num_gpfn);
+       error = HYPERVISOR_remove_physmap(start_gpfn, order);
+       if (error) {
+               goto fail;
        }
 
-       for (i = 0; i < num_pfn; i++) {
-               error = HYPERVISOR_populate_physmap(start_gpfn + i, 0, 0);
-               if (error) {
-                       goto out;
-               }
+       set_xen_guest_handle(reservation.extent_start, gpfns);
+       reservation.nr_extents   = num_gpfn;
+       reservation.address_bits = 0;
+       reservation.extent_order = 0;
+       reservation.domid        = DOMID_SELF;
+       error = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation);
+       if (error != num_gpfn) {
+               error = -EFAULT;//XXX
+               goto fail;
        }
-
+       error = 0;
 out:
        balloon_unlock(flags);
+       kfree(gpfns);
        if (error) {
-               //XXX
+               // error can't be returned.
+               BUG();//XXX
        }
+       return;
+
+fail:
+       for (i = 0; i < num_gpfn; i++) {
+               int tmp_error;// don't overwrite error.
+               tmp_error = HYPERVISOR_populate_physmap(start_gpfn + i, 0, 0);
+               if (tmp_error) {
+                       BUG();//XXX
+               }
+       }
+       goto out;
 }
 
 
@@ -296,38 +352,6 @@ HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count)
 }
 
 
-///////////////////////////////////////////////////////////////////////////
-//XXX taken from balloon.c
-//    temporal hack until balloon driver support.
-#include <linux/module.h>
-
-struct page *balloon_alloc_empty_page_range(unsigned long nr_pages)
-{
-       unsigned long vstart;
-       unsigned int  order = get_order(nr_pages * PAGE_SIZE);
-
-       vstart = __get_free_pages(GFP_KERNEL, order);
-       if (vstart == 0)
-               return NULL;
-
-       return virt_to_page(vstart);
-}
-
-void balloon_dealloc_empty_page_range(
-       struct page *page, unsigned long nr_pages)
-{
-       __free_pages(page, get_order(nr_pages * PAGE_SIZE));
-}
-
-void balloon_update_driver_allowance(long delta)
-{
-}
-
-EXPORT_SYMBOL(balloon_alloc_empty_page_range);
-EXPORT_SYMBOL(balloon_dealloc_empty_page_range);
-EXPORT_SYMBOL(balloon_update_driver_allowance);
-
-
 ///////////////////////////////////////////////////////////////////////////
 // PageForeign(), SetPageForeign(), ClearPageForeign()
 
index 18e68c5e7827f58c1d982272772ccefffaf66052..5bc074a9adfc6072cf48eea66955db5b1176c3b5 100644 (file)
@@ -74,13 +74,18 @@ void free_vm_area(struct vm_struct *area)
        // This area is used for foreign page mappping.
        // So underlying machine page may not be assigned.
        for (i = 0; i < (1 << order); i++) {
-               unsigned long error;
-               error = HYPERVISOR_populate_physmap(
-                       (area->phys_addr >> PAGE_SHIFT) + i, 0, 0);
-               if (error) {
-                       BUG();//XXX
-                       return;
-               }
+               unsigned long ret;
+               unsigned long gpfn = (area->phys_addr >> PAGE_SHIFT) + i;
+               struct xen_memory_reservation reservation = {
+                       .nr_extents   = 1,
+                       .address_bits = 0,
+                       .extent_order = 0,
+                       .domid        = DOMID_SELF
+               };
+               set_xen_guest_handle(reservation.extent_start, &gpfn);
+               ret = HYPERVISOR_memory_op(XENMEM_populate_physmap,
+                                          &reservation);
+               BUG_ON(ret != 1);
        }
        free_pages((unsigned long)area->addr, order);
        kfree(area);
index 7f1d36218e669acfb97426b8ea3290149ca04d68..368081e523f5e2a172c5011dc26132b68034509a 100644 (file)
@@ -457,27 +457,6 @@ HYPERVISOR_machtophys(unsigned long mfn)
        return ret;
 }
 
-static inline unsigned long
-__HYPERVISOR_populate_physmap(unsigned long gpfn, unsigned int extent_order,
-                             unsigned int address_bits)
-{
-       return _hypercall_imm3(unsigned long, ia64_dom0vp_op,
-                              IA64_DOM0VP_populate_physmap, gpfn, 
-                              extent_order, address_bits);
-}
-
-static inline unsigned long
-HYPERVISOR_populate_physmap(unsigned long gpfn, unsigned int extent_order,
-                           unsigned int address_bits)
-{
-       unsigned long ret = 0;
-       if (running_on_xen) {
-               ret = __HYPERVISOR_populate_physmap(gpfn, extent_order,
-                                                   address_bits);
-       }
-       return ret;
-}
-
 static inline unsigned long
 __HYPERVISOR_zap_physmap(unsigned long gpfn, unsigned int extent_order)
 {
@@ -503,6 +482,7 @@ __HYPERVISOR_add_physmap(unsigned long gpfn, unsigned long mfn,
                               IA64_DOM0VP_add_physmap, gpfn, mfn, flags,
                               domid);
 }
+
 static inline unsigned long
 HYPERVISOR_add_physmap(unsigned long gpfn, unsigned long mfn,
                       unsigned int flags, domid_t domid)
@@ -522,8 +502,6 @@ HYPERVISOR_add_physmap(unsigned long gpfn, unsigned long mfn,
 #define HYPERVISOR_ioremap(ioaddr, size)               (ioaddr)
 #define HYPERVISOR_phystomach(gpfn)                    (gpfn)
 #define HYPERVISOR_machtophys(mfn)                     (mfn)
-#define HYPERVISOR_populate_physmap(gpfn, extent_order, address_bits) \
-                                                       (0)
 #define HYPERVISOR_zap_physmap(gpfn, extent_order)     (0)
 #define HYPERVISOR_add_physmap(gpfn, mfn, flags)       (0)
 #endif